package br.com.rookgraph;

import java.util.Random;
import java.util.Scanner;

import javax.management.RuntimeErrorException;

/**
 * Roda e exibe os resultados do 2 algoritmos, IR e IR alterado,
 * para grafos gerados aleatóriamente.
 *
 * @author Luan Pontes
 * @since 19-10-12
 *
 */
public class RunGenerateGraph {

	public static void main(String[] args) {
		int pior = 0;
		int melhor = 0;

		int qtdBranchNormal = 0; int  qtdBranchAlterado = 0;

		Scanner s = new Scanner(System.in);

		System.out.println("Digite o número de vertices para cada grafo: ");
		int numV = s.nextInt();


		System.out.println("Digite a Probabilidade de incidência de arestas (0-99): ");
		int incEdge = s.nextInt();

		int i = 1;

		System.out.println( "\n *****  Resultado *****");
		System.out.println( "Grafo  Normal  Alterado");

		while (qtdBranchNormal >= qtdBranchAlterado) {
			GenerateGraph generateGraph = new GenerateGraph();
			Graph graph = generateGraph.generateWhit(numV, incEdge);

			int raiz = new Random().nextInt(numV)+1;

			Graph treeIni = graph.getTreeLarge(new Graph(graph.getOrder()), raiz);

			BranchReduce brancheReduceIr = new BranchReduce(graph, clone(treeIni), true);

			BranchReduce brancheReduce = new BranchReduce(graph,  clone(treeIni), false);

			Graph resultIr = brancheReduceIr.execute();
			Graph result = brancheReduce.execute();

			qtdBranchNormal = resultIr.getBranchs().length;
			qtdBranchAlterado = result.getBranchs().length;

			if (qtdBranchNormal > qtdBranchAlterado) {
				++melhor;
			}
			else{
				if (qtdBranchNormal < qtdBranchAlterado) {
					++pior;
				}
			}

			showResult(result,resultIr,i);
			++i;

			if (qtdBranchNormal < qtdBranchAlterado){
				System.out.println("\n\nMelhores Resultado com IR NORMAL   ==> "+pior);
				System.out.println("Melhores Resultado com IR ALTERADO ==> "+melhor);

				System.out.println("\n\n\n ############ Heuristica Normal #############\n");
				new BrancheReduceDepuration(graph, clone(treeIni), true).execute();
				System.out.println("\n\n\n ############ Heuristica Alterado ############\n");
				new BrancheReduceDepuration(graph, clone(treeIni), false).execute();
			}



		}
	}


	/**
	 * Retorna um clone do grafo passado, uma nova instancia
	 * com a mesma matriz de adjacencia.
	 *
	 * @param treeLarge
	 * @return clone da tree
	 */
	public static Graph clone(Graph graph){
		try {
			return (Graph) graph.clone();
		} catch (CloneNotSupportedException e) {
			throw new RuntimeException(e);
		}
	}


	private static void showResult(Graph result, Graph resultIr, int j) {
		int qtdBranchNormal, qtdBranchAlterado;

		qtdBranchNormal = resultIr.getBranchs().length;
		qtdBranchAlterado = result.getBranchs().length;

		if (qtdBranchNormal != qtdBranchAlterado) {
			System.out.println("* "+j +"      "+qtdBranchNormal+"        "+qtdBranchAlterado);
		}
		else {
			System.out.println("  "+j +"      "+qtdBranchNormal+"        "+qtdBranchAlterado);
		}
	}
}